﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using SGT_DAL._STG_DALTableAdapters;
using SGT_DAL;
using System.Linq;

namespace SGT_ON
{    
    public static class Parametros
    {
        #region Metodos de los parametros desde la base de datos
        private static ParametroDeBDColeccion _parametros;
        private static ParametroDeBDColeccion ParametrosON
        {
            get
            {
                if (_parametros == null)
                {
                    _parametros = ParametroDeBD.ObtenerTodos();
                }
                return _parametros;
            }
        }

        private static string ObtenerValorDeParametro(string pNombreParametro)
        {
            foreach (ParametroDeBD _parametro in ParametrosON)
            {
                if (_parametro.NombreParametro == pNombreParametro)
                    return _parametro.Valor;
            }
            throw new ArgumentException("El parametro no existe en la base de datos");
        }
        private static void ActualizarParametro(string pNombreParametro, string pValor)
        {
            foreach (ParametroDeBD _parametro in ParametrosON)
            {
                if (_parametro.NombreParametro == pNombreParametro)
                {
                    _parametro.Valor = pValor;
                    _parametro.Actualizar(); //lo guardo en la base de datos.
                }
            }
        }
        #endregion

        public static string CostoPorPano
        {
            get
            {
                return ObtenerValorDeParametro("CostoPorPano");
                //return ConfigurationSettings.AppSettings["CostoDePano"];
            }
            set
            {
                ActualizarParametro("CostoPorPano", value);
                //ConfigurationSettings.AppSettings["CostoDePano"] = value;
            }
        }
        public static int AlertaPorElementosSinAsignarAutomaticamenteCadaMinutos
        {
            get
            {
                return int.Parse(ObtenerValorDeParametro("ElementosSinAsignarAutomaticamenteCadaMinutos"));
                
            }
            set
            {
                ActualizarParametro("ElementosSinAsignarAutomaticamenteCadaMinutos", value.ToString());
            }
        }
        
        /// <summary>
        /// Es la cantidad de dias que se busca hacia adelante por presupuestos que tienen alerta por fecha de entrega.
        /// Se utiliza en los procesos automáticos
        /// </summary>
        public static int DiasAlertaDeEntrega
        {
            get
            {
                return int.Parse(ObtenerValorDeParametro("DiasAlertaDeEntrega"));

            }
            set
            {
                ActualizarParametro("DiasAlertaDeEntrega", value.ToString());
            }
        }
        /// <summary>
        /// Es la cantidad de dias que tienen que pasar para que un presupuesto en estado Borrador pase a estado Presupuesto en forma automática.
        /// </summary>
        public static int MesesParaPasarDePresupuestoACerrado
        {
            get
            {
                return int.Parse(ObtenerValorDeParametro("MesesParaPasarDePresupuestoACerrado"));
                
            }
            set
            {
                ActualizarParametro("MesesParaPasarDePresupuestoACerrado", value.ToString());
            }
        }
        /// <summary>
        /// Es la cantidad de meses que tienen que pasar para que un presupuesto en estado Presupuesto a Cerrado en forma automática.
        /// </summary>
        public static int DiasParaPasarDeBorradorAPresupuesto
        {
            get
            {
                return int.Parse(ObtenerValorDeParametro("DiasParaPasarDeBorradorAPresupuesto"));

            }
            set
            {
                ActualizarParametro("DiasParaPasarDeBorradorAPresupuesto", value.ToString());
            }
        }

        public static string FormatoDinero
        {
            get
            {
                return "#0.00";
            }
        }
        public static string Impresora
        {
            get
            {
                return ConfigurationSettings.AppSettings["Impresora"];
            }
            set
            {
                ConfigurationSettings.AppSettings["Impresora"] = value;
            }
        }
        public static string RutaPlantillaPresupuesto
        {
            get
            {
                return ConfigurationSettings.AppSettings["RutaPlantillaPresupuesto"];
            }
            set
            {
                ConfigurationSettings.AppSettings["RutaPlantillaPresupuesto"] = value;
            }
        }
        public static string RutaPlantillaEtiqueta
        {
            get
            {
                return ConfigurationSettings.AppSettings["RutaPlantillaEtiqueta"];
            }
            set
            {
                ConfigurationSettings.AppSettings["RutaPlantillaEtiqueta"] = value;
            }
        }
        public static string RutaPlantillaOrdenDeTrabajo
        {
            get
            {
                return ConfigurationSettings.AppSettings["RutaPlantillaOrdenDeTrabajo"];
            }
            set
            {
                ConfigurationSettings.AppSettings["RutaPlantillaOrdenDeTrabajo"] = value;
            }
        }

        public static string RutaPlantillaRepuestos
        {
            get
            {
                return ConfigurationSettings.AppSettings["RutaPlantillaRepuestos"];
            }
            set
            {
                ConfigurationSettings.AppSettings["RutaPlantillaRepuestos"] = value;
            }
        }
        public static int SectorIdChaperia
        {
            get
            {
                return int.Parse(ConfigurationSettings.AppSettings["SectorIdChaperia"]);
            }
            set
            {
                ConfigurationSettings.AppSettings["SectorIdChaperia"] = value.ToString();
            }
        }
        public static int SectorIdPintura
        {
            get
            {
                return int.Parse(ConfigurationSettings.AppSettings["SectorIdPintura"]);
            }
            set
            {
                ConfigurationSettings.AppSettings["SectorIdPintura"] = value.ToString();
            }
        }
        public static int SectorIdTaller
        {
            get
            {
                return int.Parse(ConfigurationSettings.AppSettings["SectorIdTaller"]);
            }
            set
            {
                ConfigurationSettings.AppSettings["SectorIdTaller"] = value.ToString();
            }
        }
        public static DateTime FechaMinima
        {
            get
            {
                return DateTime.Parse("01/01/1900");
            }
        }
        
        public static string CarpetaDeFotos
        {
            get
            {
                return ConfigurationSettings.AppSettings["CarpetaDeFotos"];
            }
            set
            {
                ConfigurationSettings.AppSettings["CarpetaDeFotos"] = value;
            }
        }

        public static bool DetenerTodosLosHilosConAccesoADatos
        {
            get
            {
                if (ConfigurationSettings.AppSettings["DetenerTodosLosHilosConAccesoADatos"] == "1")
                    return true;
                else
                    return false;
            }
        }
        
        #region Formatos
        public static  System.Drawing.Color ColorFondoCheckBoxEnDetalle
        {
            get
            {
                string _color = ConfigurationSettings.AppSettings["ColorFondoCheckBoxEnDetalle"];
                int r, g, b;
                string[] _colores = _color.Split(char.Parse("-"));
                int.TryParse(_colores[0], out r);
                int.TryParse(_colores[1], out g);
                int.TryParse(_colores[2], out b);

                return System.Drawing.Color.FromArgb(r, g, b);
                //return ConfigurationSettings.AppSettings["ColorFondoCheckBoxEnDetalle"];
            }
        }
        #endregion
    }

    #region Clases de parametros con la BD
    public class ParametroDeBD
    {
        #region Variables
        private int _ParametroId;
        private string _NombreParametro;
        private string _Valor;
        private string _Descripcion;

        #endregion

        #region Propiedades
        public int ParametroId
        {
            get { return _ParametroId; }
            set { _ParametroId = value; }
        }
        public string NombreParametro
        {
            get { return _NombreParametro; }
            set { _NombreParametro = value; }
        }
        public string Valor
        {
            get { return _Valor; }
            set { _Valor = value; }
        }
        public string Descripcion
        {
            get { return _Descripcion; }
            set { _Descripcion = value; }
        }
        #endregion

        #region Funciones
        /// <summary>
        /// Actualiza el objeto.
        /// </summary>
        /// <returns>No devuelve nada.</returns>
        public void Actualizar()
        {
            ActualizarDAL(NombreParametro, Valor, Descripcion, ParametroId);
        }
        public static ParametroDeBD AsignarRowAObjeto(SGT_DAL._STG_DAL.ParametrosRow pRow)
        {
            ParametroDeBD _ParametroDeBD = new ParametroDeBD();

            _ParametroDeBD.ParametroId = pRow.ParametroId;

            _ParametroDeBD.NombreParametro = pRow.NombreParametro;

            _ParametroDeBD.Valor = pRow.Valor;

            _ParametroDeBD.Descripcion = pRow.Descripcion;

            return _ParametroDeBD;
        }
        #endregion

        #region Interfase DAL
        //objeto de la capa DAL
        private static ParametrosTableAdapter _ParametrosTA;
        protected static ParametrosTableAdapter Adaptador
        {
            get
            {
                if (_ParametrosTA == null)
                    _ParametrosTA = new ParametrosTableAdapter();

                return _ParametrosTA;
            }
        }
        public bool ActualizarDAL(string pNombreParametro, string pValor, string pDescripcion, int pParametroId)
        {
            if (0 < Adaptador.Actualizar(pNombreParametro, pValor, pDescripcion, pParametroId))
            {
                return true;
            }
            else
                return false;
        }
        //public static ParametroDeBDColeccion ObtenerTodos()
        //{
        //    SGT_DAL._STG_DAL.ParametrosDataTable _parametrosDT = Adaptador.ObtenerTodosLosParametros();
        //    return AsignarParametrosDataTableAColeccion(_parametrosDT);
        //}
        protected static ParametroDeBDColeccion AsignarParametrosDataTableAColeccion(SGT_DAL._STG_DAL.ParametrosDataTable pDataTable)
        {
            ParametroDeBDColeccion _ParametroColeccion = new ParametroDeBDColeccion();
            ParametroDeBD _Parametro;

            if ((pDataTable != null)
                && (pDataTable.Rows.Count > 0))
            {
                foreach (SGT_DAL._STG_DAL.ParametrosRow _row in pDataTable.Rows)
                {
                    _Parametro = AsignarRowAObjeto(_row);
                    if (_Parametro != null)
                        _ParametroColeccion.Add(_Parametro);
                }
            }
            return _ParametroColeccion;
        }
        #endregion

        #region linq
        
        public void Actualizar(string pNombreParametro, string pValor, string pDescripcion, int pParametroId)
        {
            BaseLinQDataContext _linq_db = new BaseLinQDataContext();

            SGT_DAL.Parametros _parametros = new SGT_DAL.Parametros();
            _parametros.Descripcion = pDescripcion;
            _parametros.Valor = pValor;
            _parametros.NombreParametro = pNombreParametro;

            _linq_db.Parametros.InsertOnSubmit(_parametros);
            _linq_db.SubmitChanges();
        }
        public void Insertar(string pNombreParametro, string pValor, string pDescripcion)
        {
            BaseLinQDataContext _linq_db = new BaseLinQDataContext();

            SGT_DAL.Parametros __parametro = new SGT_DAL.Parametros();

            __parametro.Descripcion = pDescripcion;
            __parametro.NombreParametro = pNombreParametro;
            __parametro.Valor = pValor;

            _linq_db.Parametros.InsertOnSubmit(__parametro);
            _linq_db.SubmitChanges();

        }
        public static ParametroDeBDColeccion ObtenerTodos()
        {
            BaseLinQDataContext _linq_db = new BaseLinQDataContext();

            var consulta = from x in _linq_db.Parametros select x;

            ParametroDeBDColeccion _ParametroColeccion = new ParametroDeBDColeccion();
            ParametroDeBD _Parametro;

            foreach (SGT_DAL.Parametros _par in consulta)
            {
                _Parametro = new ParametroDeBD();
                _Parametro.Descripcion = _par.Descripcion;
                _Parametro.NombreParametro = _par.NombreParametro;
                _Parametro.Valor = _par.Valor;
                _Parametro.ParametroId = _par.ParametroId;

                _ParametroColeccion.Add(_Parametro);
            }

            return _ParametroColeccion;
        }

        #endregion

    }
    public class ParametroDeBDColeccion : System.Collections.CollectionBase
    {
        public void Add(ParametroDeBD pParametroDeBD)
        {
            this.List.Add(pParametroDeBD);
        }
        public void Remove(int index)
        {
            if (index <= Count - 1 || index >= 0)
            {
                this.List.RemoveAt(index);
            }
            else
            {
                throw new System.ArgumentException("Fuera de rango", "original");
            }
        }
        public ParametroDeBD this[int index]
        {
            get { return ((ParametroDeBD)(this.List[index])); }
            set { this.List[index] = value; }
        }
        /// <summary>
        /// Si el parametro no existe, devuelve Null
        /// </summary>
        /// <param name="pNombre"></param>
        /// <returns></returns>
        public string ObtenerValorPorNombre(string pNombre)
        {
            foreach (ParametroDeBD _parametro in this)
            {
                if (_parametro.NombreParametro == pNombre)
                {
                    return _parametro.Valor;
                }
            }
            return null;
        }
        public void ModificarPorNombre(string pNombre, string pValor)
        {
            foreach (ParametroDeBD _parametro in this)
            {
                if (_parametro.NombreParametro == pNombre)
                {
                    _parametro.Valor = pValor;
                    _parametro.Actualizar();
                }
            }
        }
    }
    #endregion  
}
